Pythonã®ããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ãšã¹ããŒãé²åãç¿åŸãåæ¹ã»åŸæ¹ãã€ã°ã¬ãŒã·ã§ã³ãããŒã¿ãã€ã°ã¬ãŒã·ã§ã³ããŒãããŠã³ã¿ã€ã ãããã€ã¡ã³ããªã©ã®æŠç¥ãšãã°ããŒãã«ãªãœãããŠã§ã¢éçºã«ããããã¹ããã©ã¯ãã£ã¹ã解説ã
PythonããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ïŒã¹ããŒãé²åæŠç¥
çµ¶ããé²åãç¶ãããœãããŠã§ã¢éçºã®ç¶æ³ã«ãããŠãããŒã¿ããŒã¹ã¹ããŒãã®å€æŽã广çã«ç®¡çããããšã¯æãéèŠã§ããããã¯ãã¢ããªã±ãŒã·ã§ã³ã倿§ãªãŠãŒã¶ãŒããŒã¹ã«ãµãŒãã¹ãæäŸããæ¥éã«å€åããèŠä»¶ã«é©å¿ããªããã°ãªããªãã°ããŒãã«ãªç¶æ³ã§ã¯ç¹ã«åœãŠã¯ãŸããŸããPythonã¯ããã®å€æ§æ§ãšåºç¯ãªãšã³ã·ã¹ãã ã«ãããã·ãŒã ã¬ã¹ãªããŒã¿ããŒã¹ã¹ããŒãé²åã調æŽããããã®æ§ã ãªããŒã«ãšãã¯ããã¯ãæäŸããŸãããã®ã¬ã€ãã§ã¯ãPythonããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ã®äž»èŠãªæŠå¿µãæŠç¥ããã¹ããã©ã¯ãã£ã¹ãæ·±ãæãäžããã¢ããªã±ãŒã·ã§ã³ãå ç¢ã§ã¹ã±ãŒã©ãã«ãã€å埩åã®ããç¶æ ãä¿ã€ããšãä¿èšŒããŸãã
ããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ãéèŠãªçç±
ããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ãšã¯ãããŒã¿ããŒã¹ã®æ§é ïŒã¹ããŒãïŒã«å¯Ÿããå¶åŸ¡ããã倿Žã®ããšã§ããããã«ãããã¢ããªã±ãŒã·ã§ã³ãäžæãããããŒã¿ã倱ãããšãªããããŒãã«ã®å€æŽãã«ã©ã ã®è¿œå ãããŒã¿åã®å€æŽããªã¬ãŒã·ã§ã³ã·ããã®ç®¡çãè¡ãããšãã§ããŸãããããã¯ä»¥äžã®ç¹ã§äžå¯æ¬ ã§ãã
- ã¢ããªã±ãŒã·ã§ã³ã®å®å®æ§ã®ç¶æïŒ ã¹ããŒãããŒãžã§ã³ã®äžäžèŽããçããããŒã¿ã®äžæŽåããšã©ãŒãé²ãã
- æ°æ©èœã®å®è£ ïŒ æ°ããæ©èœãããŒã¿ã¹ãã¬ãŒãžæ©èœã远å ããã
- ããã©ãŒãã³ã¹ã®æé©åïŒ ã¹ããŒã調æŽã«ãããã¯ãšãªããã©ãŒãã³ã¹ãšããŒã¿ã¢ã¯ã»ã¹é床ãåäžãããã
- ããŒã¿æŽåæ§ã®ç¢ºä¿ïŒ å¶çŽãšããŒã¿æ€èšŒã«ãŒã«ãé©çšããã
- ã¢ããªã±ãŒã·ã§ã³ã®é²åã®ãµããŒãïŒ å€åããããžãã¹èŠä»¶ãšãŠãŒã¶ãŒããŒãºã«é©å¿ããã
ãã€ã°ã¬ãŒã·ã§ã³ãç¡èŠãããšãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ãã·ã¥ãããŒã¿ã®ç Žæãéçšåæ¢æéãªã©ã®æ·±å»ãªåé¡ã«ã€ãªããå¯èœæ§ããããŸããã°ããŒãã«ãªç¶æ³ã§ã¯ããããã®åé¡ã¯ç°ãªãå°åãã¿ã€ã ãŸãŒã³ã®ãŠãŒã¶ãŒã«åœ±é¿ãåãŒããé倧ãªçµæãæãå¯èœæ§ããããŸãã
ã³ã¢ã³ã³ã»ãã
ãã€ã°ã¬ãŒã·ã§ã³ãã¡ã€ã«
ãã€ã°ã¬ãŒã·ã§ã³ã¯éåžžãåå¥ã®ãã¡ã€ã«ã§å®çŸ©ããããããããç¬ç«ããã¹ããŒã倿Žã衚ããŸãããããã®ãã¡ã€ã«ã«ã¯ã倿Žãé©çšããã³å ã«æ»ãããã®æé ãå«ãŸããŠããŸããäžè¬çãªã³ã³ããŒãã³ãã¯æ¬¡ã®ãšããã§ãã
- ããŒãã«ã®äœæïŒ æ°ããããŒã¿ããŒã¹ããŒãã«ãäœæããŸãã
- ã«ã©ã ã®è¿œå ïŒ æ¢åã®ããŒãã«ã«æ°ããã«ã©ã ã远å ããŸãã
- ã«ã©ã ã®åé€ïŒ ããŒãã«ããã«ã©ã ãåé€ããŸãïŒæ³šæããŠäœ¿çšããŠãã ããïŒã
- ã«ã©ã ã®å€æŽïŒ æ¢åã®ã«ã©ã ã®ããããã£ïŒäŸïŒããŒã¿åãå¶çŽïŒã倿ŽããŸãã
- ã€ã³ããã¯ã¹ã®è¿œå ïŒ ã¯ãšãªããã©ãŒãã³ã¹ãåäžãããããã«ã«ã©ã ã«ã€ã³ããã¯ã¹ã远å ããŸãã
- ã€ã³ããã¯ã¹ã®åé€ïŒ ã€ã³ããã¯ã¹ãåé€ããŸãã
- å€éšããŒã®è¿œå ïŒ ããŒãã«éã®ãªã¬ãŒã·ã§ã³ã·ããã確ç«ããŸãã
- å€éšããŒã®åé€ïŒ å€éšããŒå¶çŽãåé€ããŸãã
- ã€ã³ããã¯ã¹ã®äœæïŒ 1ã€ä»¥äžã®ã«ã©ã ã«ã€ã³ããã¯ã¹ãäœæããŸãã
åæ¹ãã€ã°ã¬ãŒã·ã§ã³ãšåŸæ¹ãã€ã°ã¬ãŒã·ã§ã³
åãã€ã°ã¬ãŒã·ã§ã³ãã¡ã€ã«ã«ã¯ãéåžžã2ã€ã®äž»èŠãªé¢æ°ãå«ãŸããŠããŸãã
upgrade(): ã¹ããŒããææ°ã®ç¶æ ã«ããããã®å€æŽãå®è¡ããŸãïŒåæ¹ãã€ã°ã¬ãŒã·ã§ã³ïŒãdowngrade(): 倿Žãå ã«æ»ããã¹ããŒãã以åã®ç¶æ ã«ããŒã«ããã¯ããŸãïŒåŸæ¹ãã€ã°ã¬ãŒã·ã§ã³ïŒãããã¯ã倿Žãå ã«æ»ãããããšã©ãŒãé©åã«åŠçãããããããã«äžå¯æ¬ ã§ãã
ãã€ã°ã¬ãŒã·ã§ã³ããŒã«
ããã€ãã®Pythonã©ã€ãã©ãªãããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ãç°¡çŽ åããŸãã
- Django Migrations: Django Webãã¬ãŒã ã¯ãŒã¯ã«çµã¿èŸŒãŸããŠãããDjangoã®ORMãšå¯æ¥ã«çµ±åããã匷åã§çŽæçãªãã€ã°ã¬ãŒã·ã§ã³ã·ã¹ãã ãæäŸããŸãã
- Alembic: æ§ã ãªããŒã¿ããŒã¹ããã¯ãšã³ãã§äœ¿çšã§ããæ±çšãã€ã°ã¬ãŒã·ã§ã³ããŒã«ã§ããAlembicã¯ããã®æè»æ§ãšããè€éãªãã€ã°ã¬ãŒã·ã§ã³ã·ããªãªã®ãµããŒãã§ç¥ãããŠããŸãã
- SQLAlchemy Migrate: Alembicã®å身ã§ãããçŸåšã¯éæšå¥šãšãããŠããŸãããå€ããããžã§ã¯ãã§ã¯ééããå¯èœæ§ããããŸãã
- Flask-Migrate (Flaskåã): Flaskãããžã§ã¯ãåãã®Alembicã®äŸ¿å©ãªã©ãããŒã§ãã
ã¹ããŒãé²åæŠç¥
1. åæ¹ãã€ã°ã¬ãŒã·ã§ã³ïŒã¢ããã°ã¬ãŒãïŒ
ããã¯ããã¹ãŠã®ãã€ã°ã¬ãŒã·ã§ã³ããã»ã¹ã®æ žå¿ã§ããåãã€ã°ã¬ãŒã·ã§ã³ãã¡ã€ã«ã®upgrade()颿°ã¯ã倿Žãé©çšããããã«å¿
èŠãªã¢ã¯ã·ã§ã³ãå®çŸ©ããããŒã¿ããŒã¹ã¹ããŒããæ°ããããŒãžã§ã³ã«é²ããŸããäŸïŒ
from alembic import op
import sqlalchemy as sa
def upgrade():
op.create_table('users',
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('username', sa.String(50), nullable=False),
sa.Column('email', sa.String(120), unique=True, nullable=False)
)
ãã®äŸã§ã¯ãAlembicã䜿çšããŠãidãããusernameãããemailãã«ã©ã ãæã€ãusersãããŒãã«ãäœæããŠããŸãã
2. åŸæ¹ãã€ã°ã¬ãŒã·ã§ã³ïŒããŠã³ã°ã¬ãŒãïŒ
downgrade()颿°ã¯ã倿ŽãããŒã«ããã¯ããããã«äžå¯æ¬ ã§ããããã¯upgrade()ã§å®è¡ãããã¢ã¯ã·ã§ã³ãé転ãããŸããdowngrade()颿°ãæ
éã«èšèšããŠãããŒã¿ãä¿æãããããŒã«ããã¯åŸã«ã¢ããªã±ãŒã·ã§ã³ãæ£ããæ©èœããããã«ããããšãéèŠã§ããäŸïŒ
from alembic import op
import sqlalchemy as sa
def downgrade():
op.drop_table('users')
ãã®äŸã§ã¯ããusersãããŒãã«ãåé€ããåæ¹ãã€ã°ã¬ãŒã·ã§ã³ãå®è³ªçã«å ã«æ»ããŠããŸãã
3. ããŒã¿ãã€ã°ã¬ãŒã·ã§ã³
ã¹ããŒã倿Žã«ã¯ãããŒã¿å€æãããŒã¿ãã€ã°ã¬ãŒã·ã§ã³ãå¿
èŠãšãªãå ŽåããããŸããããã«ã¯ãã«ã©ã éã§ã®ããŒã¿ã®ç§»åãããŒã¿åœ¢åŒã®å€æãæ°ããã«ã©ã ãžã®åæå€ã®æå
¥ãªã©ãå«ãŸããŸããããŒã¿ãã€ã°ã¬ãŒã·ã§ã³ã¯éåžžupgrade()颿°å
ã§å®è¡ãããå¿
èŠã«å¿ããŠdowngrade()å
ã§å
ã«æ»ãããŸããDjangoãã€ã°ã¬ãŒã·ã§ã³ã䜿çšããäŸïŒ
from django.db import migrations
from django.db.models import F
class Migration(migrations.Migration):
dependencies = [
('your_app', '0001_initial'), # Previous migration
]
operations = [
migrations.AddField(
model_name='profile',
name='full_name',
field=migrations.CharField(max_length=150, blank=True, null=True),
),
migrations.RunPython(
# Function to migrate data
def update_full_name(apps, schema_editor):
Profile = apps.get_model('your_app', 'Profile')
for profile in Profile.objects.all():
profile.full_name = f'{profile.first_name} {profile.last_name}'
profile.save()
reverse_code = migrations.RunPython.noop,
),
]
ãã®äŸã§ã¯ã`Profile`ã¢ãã«ã«`full_name`ãã£ãŒã«ãã远å ããæ¢åã®`first_name`ãš`last_name`ãã£ãŒã«ãã®ããŒã¿ã§ãããæå ¥ããŸãã`reverse_code`ãã©ã¡ãŒã¿ã¯ã倿Žãå ã«æ»ã颿°ïŒã€ãŸããã«ã©ã ã®åé€ã`full_name`ã空çœã«èšå®ãããªã©ïŒããªãã·ã§ã³ã§æå®ããããã«äœ¿çšãããŸãã
4. ãŒãããŠã³ã¿ã€ã ãããã€ã¡ã³ã
ãããã€ã¡ã³ãäžã®ããŠã³ã¿ã€ã ãæå°éã«æãããããªããããšã¯ãç¹ã«ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠéèŠã§ãããŒãããŠã³ã¿ã€ã ãããã€ã¡ã³ãã¯ããµãŒãã¹ãäžæããã«ã¹ããŒã倿Žãé©çšã§ããããã€ãã®æŠç¥ã«ãã£ãŠå®çŸãããŸããäžè¬çãªã¢ãããŒãã¯æ¬¡ã®ãšããã§ãã
- ãã«ãŒ/ã°ãªãŒã³ãããã€ã¡ã³ãïŒ 2ã€ã®åäžã®ç°å¢ïŒãã«ãŒãšã°ãªãŒã³ïŒãç¶æããŸããæ°ããããŒãžã§ã³ãäžæ¹ã®ç°å¢ïŒäŸïŒã°ãªãŒã³ç°å¢ïŒã«ãããã€ãããã¹ãããåŸããã©ãã£ãã¯ãã°ãªãŒã³ç°å¢ã«åãæ¿ããŸãã
- ã«ããªã¢ãªãªãŒã¹ïŒ æ°ããããŒãžã§ã³ãå°æ°ã®ãŠãŒã¶ãŒïŒãã«ããªã¢ãïŒã«ãªãªãŒã¹ãããã®ããã©ãŒãã³ã¹ãç£èŠããŸããã«ããªã¢ãªãªãŒã¹ãæåããå Žåãæ®µéçã«å€æŽãããå€ãã®ãŠãŒã¶ãŒã«å±éããŸãã
- æ©èœãã©ã°ïŒ æ©èœãã©ã°ã䜿çšããŠæ°æ©èœã®å¯èŠæ§ãå¶åŸ¡ããŸããããã«ããããã¹ãŠã®ãŠãŒã¶ãŒã«ããã«æ°ããæ©èœãå ¬éãããããšãªããã³ãŒã倿ŽãšããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ããããã€ã§ããŸãã
- åŸæ¹äºææ§ã®ãã倿ŽïŒ æ°ããã³ãŒããå€ãããŒã¿ããŒã¹ã¹ããŒããšæ°ããããŒã¿ããŒã¹ã¹ããŒãã®äž¡æ¹ãšäºææ§ãããããšã確èªããŸããããã«ãããæåã«ã³ãŒãããããã€ãããã®åŸã«ããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ãé©çšããŠãããŠã³ã¿ã€ã ãçºçããªãããã«ã§ããŸããããã¯ãç°ãªãå°ççå°åéã§ããŒãªã³ã°ã¢ããããŒããç°ãªãã¿ã€ãã³ã°ã§çºçããå¯èœæ§ãããåœéçãªç¶æ³ã§ã¯ç¹ã«éèŠã§ãã
5. ãªã³ã©ã€ã³ã¹ããŒã倿Ž
éåžžã«å€§èŠæš¡ãªããŒã¿ããŒã¹ã®å Žåãã¹ããŒã倿Žã®å®è¡ã«ã¯æéããããããšããããŸããæ§ã ãªããŒã¿ããŒã¹ã·ã¹ãã ãæäŸãããªã³ã©ã€ã³ã¹ããŒã倿ŽããŒã«ïŒäŸïŒMySQL/MariaDBçšã®`pt-online-schema-change`ããŸãã¯PostgreSQLã®çµã¿èŸŒã¿ãªã³ã©ã€ã³ALTER TABLEæ©èœïŒã䜿çšãããšãããŒãã«ãé·æéããã¯ããããšãªãã¹ããŒã倿Žãå®è¡ã§ããŸããããã¯ãäžçäžã®ãŠãŒã¶ãŒã«ãµãŒãã¹ãæäŸããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠéåžžã«éèŠã§ããããŠã³ã¿ã€ã ã¯è€æ°ã®ã¿ã€ã ãŸãŒã³ã®ãŠãŒã¶ãŒã«æªåœ±é¿ãåãŒãå¯èœæ§ãããããã§ãã
PythonããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ã®ãã¹ããã©ã¯ãã£ã¹
1. ããŒãžã§ã³ç®¡ç
ãã€ã°ã¬ãŒã·ã§ã³ãã³ãŒããšããŠæ±ããããŒãžã§ã³ç®¡çïŒäŸïŒGitïŒã«ä¿åããŸããããã«ããã倿Žã远跡ãã广çã«å ±åäœæ¥ãè¡ãã以åã®ã¹ããŒãããŒãžã§ã³ã«ç°¡åã«æ»ãããšãã§ããŸãããã€ã°ã¬ãŒã·ã§ã³ãã¡ã€ã«ããããžã§ã¯ãã®ãªããžããªã®äžéšã§ãããã³ãŒã倿Žãšäžç·ã«ã¬ãã¥ãŒãããããšã確èªããŠãã ããã
2. ã¹ãçãªãã€ã°ã¬ãŒã·ã§ã³
ãã€ã°ã¬ãŒã·ã§ã³ãã¹ãçã«èšèšããŸããã€ãŸããåæé©çšãè¶ ããŠçµæã倿Žããããšãªããè€æ°åå®è¡ã§ãããšããããšã§ããããã¯ããããã€ã¡ã³ãäžã®ãšã©ãŒãåŠçããããŒã¿ããŒã¹ã¹ããŒããåžžã«äžè²«ããŠããããšãä¿èšŒããããã«äžå¯æ¬ ã§ãã
3. ã¢ãããã¯ãªãã€ã°ã¬ãŒã·ã§ã³
å¯èœãªéããé¢é£ããã¹ããŒã倿Žãåäžã®ã¢ãããã¯ãªãã©ã³ã¶ã¯ã·ã§ã³ã«ã°ã«ãŒãåããŸããããã«ããããã¹ãŠã®å€æŽãæåããããã©ããæåããªããã®ã©ã¡ããã«ãªããããŒã¿ããŒã¹ãéšåçã«æŽæ°ãããç¶æ ã«ãªãã®ãé²ããŸããè€æ°ã®æäœãåäžã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ã©ããããããã«ããŒã¿ããŒã¹ã®ãã©ã³ã¶ã¯ã·ã§ã³ç®¡çã䜿çšããŸãã
4. ãã¹ã
ãã€ã°ã¬ãŒã·ã§ã³ãæ¬çªç°å¢ã«ãããã€ããåã«ã培åºçã«ãã¹ãããŸããã¢ããªã±ãŒã·ã§ã³ãæ°ããã¹ããŒãã§æ£ããæ©èœããããšã確èªããããã®çµ±åãã¹ããäœæããŸããå®éã®æ¡ä»¶ãã·ãã¥ã¬ãŒãããããã«ãæ¬çªããŒã¿ã®ã³ããŒãå«ããã¹ãããŒã¿ããŒã¹ãèšå®ããããšãæ€èšããŠãã ãããèªååã¯ãåçŸæ§ãšä¿¡é Œæ§ã®é«ããã¹ãã«ãšã£ãŠéèŠã§ãã
5. ããã¥ã¡ã³ã
åãã€ã°ã¬ãŒã·ã§ã³ã®ç®çãå®è¡ãããããŒã¿å€æãããã³å€æŽã«é¢é£ããæœåšçãªãªã¹ã¯ãå«ãããã€ã°ã¬ãŒã·ã§ã³ãææžåããŸããããã¥ã¡ã³ãã¯ãå°æ¥ã®éçºè ãã¹ããŒã倿Žã®å±¥æŽãçè§£ããæœåšçãªåé¡ããããã°ããã®ã«åœ¹ç«ã¡ãŸãã
6. ã¢ãã¿ãªã³ã°
ãã€ã°ã¬ãŒã·ã§ã³ããããã€ããåŸãããŒã¿ããŒã¹ãç£èŠããŸããã¯ãšãªã®ããã©ãŒãã³ã¹ãããŒã¿ããŒã¹ãµã€ãºãããã³çºçããå¯èœæ§ã®ãããšã©ãŒã远跡ããŸããæœåšçãªåé¡ãéç¥ããè¿ éã«å¯ŸåŠããããã®ã¢ã©ãŒããå®è£ ããŸããã¯ãšãªã®é å»¶ããšã©ãŒçããã£ã¹ã¯ã¹ããŒã¹äœ¿çšéãªã©ã®äž»èŠãªã¡ããªãã¯ã远跡ããç£èŠããŒã«ã䜿çšããŠãæé©ãªããã©ãŒãã³ã¹ã確ä¿ããŸãã
7. ã¹ããŒãèšèšã®ãã¹ããã©ã¯ãã£ã¹
åªããã¹ããŒãèšèšã¯ã广çãªãã€ã°ã¬ãŒã·ã§ã³ã®åºç€ã§ããæ¬¡ã®ã¬ã€ãã©ã€ã³ãæ€èšããŠãã ããã
- é©åãªããŒã¿åãéžæããïŒ ããŒã¿ãæ£ç¢ºã«è¡šçŸããã¹ãã¬ãŒãžãæé©åããããŒã¿åãéžæããŸãã
- ã€ã³ããã¯ã¹ãæŠç¥çã«äœ¿çšããïŒ `WHERE`å¥ã`JOIN`æäœã`ORDER BY`å¥ã§é »ç¹ã«äœ¿çšãããã«ã©ã ã«ã€ã³ããã¯ã¹ã远å ããŠãã¯ãšãªããã©ãŒãã³ã¹ãåäžãããŸããã€ã³ããã¯ã¹ã®éå°ãªäœ¿çšã¯æžã蟌ã¿ããã©ãŒãã³ã¹ãäœäžãããå¯èœæ§ãããããã培åºçãªãã¹ããéèŠã§ãã
- å¶çŽãé©çšããïŒ å€éšããŒãäžææ§å¶çŽããã§ãã¯å¶çŽã䜿çšããŠããŒã¿æŽåæ§ã確ä¿ããŸãã
- ããŒã¿ãæ£èŠåããïŒ åé·æ§ãæžãããããŒã¿ã®äžè²«æ§ãåäžãããããã«ããŒã¿ãæ£èŠåããŸãããã ããããã©ãŒãã³ã¹ãéèŠãªé åã§ã¯ãæ éã«ç®¡çãããŠããå Žåã«éãã鿣èŠåãæ€èšããŠãã ããã
8. ããŒã¿ããã¯ã¢ãããšãªã«ããª
ã¹ããŒã倿Žãé©çšããåã«ãå¿ ãããŒã¿ããŒã¹ãããã¯ã¢ããããŠãã ããããã€ã°ã¬ãŒã·ã§ã³äžã®ãšã©ãŒã«ããããŒã¿æå€±ããä¿è·ããããã«ãå ç¢ãªããã¯ã¢ãããšãªã«ããªæŠç¥ãå®è£ ããŸãããªã«ããªæé ãæ£ããæ©èœããããšã確èªããããã«ã宿çã«ãã¹ãããŠãã ãããããŒã¿ã®ã»ãã¥ãªãã£ãšãªã«ããªã®å®¹æãã®ããã«ãã¯ã©ãŠãããŒã¹ã®ããã¯ã¢ãããœãªã¥ãŒã·ã§ã³ã®äœ¿çšãæ€èšããŠãã ããã
é©åãªããŒã«ã®éžæ
ãã€ã°ã¬ãŒã·ã§ã³ããŒã«ã®éžæã¯ããããžã§ã¯ãã®ãã¬ãŒã ã¯ãŒã¯ãšããŒã¿ããŒã¹ã·ã¹ãã ã«ãã£ãŠç°ãªããŸããDjangoã䜿çšããŠããå Žåã¯ãDjangoã«çµã¿èŸŒãŸããŠãããã€ã°ã¬ãŒã·ã§ã³ãåªããåºçºç¹ã§ããAlembicã¯ãä»ã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãããããžã§ã¯ãããããé«åºŠãªæ©èœãå¿ èŠãªå Žåã«å€ç®çãªãªãã·ã§ã³ã§ãã以äžã®èŠçŽ ãè©äŸ¡ããŠãã ããã
- ãã¬ãŒã ã¯ãŒã¯çµ±åïŒ ããŒã«ã¯éžæããWebãã¬ãŒã ã¯ãŒã¯ãšã·ãŒã ã¬ã¹ã«çµ±åãããŠããŸããïŒ
- ããŒã¿ããŒã¹ãµããŒãïŒ ããŒã«ã¯ããŒã¿ããŒã¹ïŒäŸïŒPostgreSQLãMySQLãSQLiteïŒããµããŒãããŠããŸããïŒ
- è€éæ§ïŒ ããŒã«ã¯é«åºŠãªãã€ã°ã¬ãŒã·ã§ã³ã·ããªãªãã«ããŒããæ©èœãæäŸããŠããŸããããããšãããåçŽãªãããžã§ã¯ãã«é©ããŠããŸããïŒ
- ã³ãã¥ããã£ãµããŒãïŒ ããŒã«ã®åšãã®ã³ãã¥ããã£ã¯ã©ã®ãããªãã®ã§ãå©ããåŸãããã§ããïŒ
- ã¹ã±ãŒã©ããªãã£ïŒ ããŒã«ã¯å€§èŠæš¡ãªããŒã¿ã»ãããšè€éãªã¹ããŒã倿ŽãåŠçããã®ã«é©ããŠããŸããïŒ
ã°ããŒãã«ãªèæ ®äºé ãšäŸ
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ãæ±ãéã«ã¯ã以äžã®è¿œå èŠçŽ ãèæ ®ããŠãã ããã
1. ã¿ã€ã ãŸãŒã³ãšãã±ãŒã«
ã¢ããªã±ãŒã·ã§ã³ã¯ãäžçäžã®ãŠãŒã¶ãŒã®ããã«ã¿ã€ã ãŸãŒã³ãšãã±ãŒã«ãæ£ããåŠçããå¿ èŠããããŸããããŒã¿ããŒã¹ã«ã¯æ¥ä»ãšæå»ãUTCã§ä¿åãã衚瀺ããéã«ãŠãŒã¶ãŒã®çŸå°æéã«å€æããŸããDjangoã䜿çšããäŸïŒ
from django.utils import timezone
now_utc = timezone.now()
åãŠãŒã¶ãŒã®å°åã«å¿ããŠæ¥ä»ãæ°å€ãé貚ããã©ãŒãããããããã«é©åãªãã±ãŒã«èšå®ã䜿çšããŠãã ããã
2. é貚ãã©ãŒããã
ã¢ããªã±ãŒã·ã§ã³ãéèååŒãæ±ãå Žåãåå°åã§æ£ããèšå·ãšãã©ãŒãããã§é貚å€ã衚瀺ããŸããå€ãã®Pythonã©ã€ãã©ãªïŒBabelã`locale`ãªã©ïŒãé貚ãã©ãŒãããããµããŒãããŠããŸãã
3. åœéåãšããŒã«ãªãŒãŒã·ã§ã³ïŒi18nãšl10nïŒ
ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ãã³ããè€æ°ã®èšèªã«ç¿»èš³ããããã«ãi18nãšl10nãå®è£ ããŸããããã«ã¯ã翻蚳ãããæååãä¿åããããã®æ°ããããŒãã«ãã«ã©ã ã®è¿œå ãå«ãŸããããšããããããŸããäŸïŒDjangoïŒïŒ
from django.db import models
from django.utils.translation import gettext_lazy as _
class Product(models.Model):
name = models.CharField(max_length=200, verbose_name=_("Product Name"))
description = models.TextField(verbose_name=_("Description"))
翻蚳ãã¡ã€ã«ïŒäŸïŒ`.po`ãã¡ã€ã«ïŒã䜿çšããŠç¿»èš³ãä¿åããDjangoã®çµã¿èŸŒã¿ç¿»è𳿩èœãªã©ã®ã©ã€ãã©ãªã掻çšããŠç¿»èš³ãããã³ã³ãã³ããæäŸããŸãã
4. ã°ããŒãã«ãªãã©ãã£ãã¯ã®ã¹ã±ãŒã©ããªãã£ãšããã©ãŒãã³ã¹
ç°ãªãå°åããã®å€§éã®ãã©ãã£ãã¯ãåŠçããããã«ãããŒã¿ããŒã¹ã®ã¬ããªã±ãŒã·ã§ã³ãšã·ã£ãŒãã£ã³ã°æŠç¥ãæ€èšããŸããããšãã°ãããŒã¿ããŒã¹ãç°ãªãå°ççå°åã®ããŒã¿ã»ã³ã¿ãŒã«ã¬ããªã±ãŒãããŠããããã®å°åã®ãŠãŒã¶ãŒã®ã¬ã€ãã³ã·ãåæžããããšãã§ããŸããããŒã¿ããŒã¹ã®è² è·ã軜æžããããã«ãã£ãã·ã¥ã¡ã«ããºã ãå®è£ ããŸãã
5. ããŒã¿ãã©ã€ãã·ãŒèŠå¶ã®éµå®
GDPRïŒäžè¬ããŒã¿ä¿è·èŠåïŒãCCPAïŒã«ãªãã©ã«ãã¢å·æ¶è²»è ãã©ã€ãã·ãŒæ³ïŒãªã©ã®ããŒã¿ãã©ã€ãã·ãŒèŠå¶ã«æ³šæããŠãã ãããã¹ããŒãèšèšãšããŒã¿ãã€ã°ã¬ãŒã·ã§ã³æŠç¥ããããã®èŠå¶ã«æºæ ããŠããããšã確èªããŠãã ãããããã«ã¯ãåææ å ±ãä¿åããããã®ãã£ãŒã«ãã®è¿œå ãããŒã¿å¿ååæè¡ã®å®è£ ããŠãŒã¶ãŒãžã®ããŒã¿ã¢ã¯ã»ã¹ããã³åé€ãªãã·ã§ã³ã®æäŸãå«ãŸããå ŽåããããŸãã
äŸã®ã·ããªãªïŒãåœãã«ã©ã ã®è¿œå ïŒDjangoïŒ
ãŠãŒã¶ãŒã®äœçœ®æ å ±ããŒã¿ããµããŒãããããã«ããUserãã¢ãã«ã«ãcountryãã«ã©ã ã远å ããå¿ èŠããããšããŸãã以äžã¯Djangoãã€ã°ã¬ãŒã·ã§ã³ã®äŸã§ãã
# your_app/migrations/0003_user_country.py
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('your_app', '0002_auto_20231027_1000'), # Previous migration
]
operations = [
migrations.AddField(
model_name='user',
name='country',
field=models.CharField(max_length=100, blank=True, null=True),
),
]
ããã«ããã`User`ã¢ãã«ã«`country`ã«ã©ã ã远å ãããŸãããã®åŸã`python manage.py migrate`ãå®è¡ããŠãã®ãã€ã°ã¬ãŒã·ã§ã³ãé©çšã§ããŸããæ³šïŒãã®äŸã§ã¯ã`blank=True, null=True`ã䜿çšããŠãããããã¯äžè¬çãªåºçºç¹ã§ããåŸã§ãã¢ããªã±ãŒã·ã§ã³ã®ããŒãºã«åºã¥ããŠããŒã¿æ€èšŒã匷å¶ããããé©åãªããã©ã«ãå€ãå¶çŽã远å ãããããããšãã§ããŸãã
çµè«
Pythonã®ããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ã¯ãå ç¢ã§ã¹ã±ãŒã©ãã«ããã€ã°ããŒãã«ã«ã¢ã¯ã»ã¹å¯èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžã§äžå¯æ¬ ãªèŠçŽ ã§ããã¹ããŒãé²åæŠç¥ãæ¡çšãããã¹ããã©ã¯ãã£ã¹ã«åŸããé©åãªããŒã«ãéžæããããšã§ãã¢ããªã±ãŒã·ã§ã³ã倿§ãªãŠãŒã¶ãŒããŒã¹ã®èŠæ±ãæºãããªãããã¹ã ãŒãºãã€å¹ççã«é²åããããšã確å®ã«ã§ããŸãããã®ã¬ã€ãã§æŠèª¬ãããŠããæŠç¥ã¯ãç¶¿å¯ãªèšç»ãšãã¹ããšçµã¿åãããããšã§ãã¢ããªã±ãŒã·ã§ã³ãã°ããŒãã«ãªç¶æ³ã«é©å¿ãæé·ããã«ã€ããŠãããŠã³ã¿ã€ã ãæå°éã«æããããŒã¿æŽåæ§ãç¶æããªãããã¹ããŒã倿Žã广çã«åŠçããããšãå¯èœã«ããŸãã
培åºçãªãã¹ããé©åãªããã¥ã¡ã³ãäœæãããã³æç¢ºã«å®çŸ©ããããããã€ã¡ã³ãããã»ã¹ã¯ãç¹ã«ã°ããŒãã«ãªãã¬ãŒã³ã¹ãæã€ãããžã§ã¯ãã«ãããŠãããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ãæåãããããã«äžå¯æ¬ ã§ããããšãå¿ããªãã§ãã ãããç¶ç¶çãªåŠç¿ãšé©å¿ã¯ããœãããŠã§ã¢éçºã®ãã€ãããã¯ãªåéã«ãããŠéèŠã§ãã